package com.tbit.uqbike.webmanager.dao.core;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tbit.uqbike.object.pojo.SubAccount;
import com.tbit.uqbike.object.pojo.SubAccountBind;
import com.tbit.uqbike.object.pojo.dto.BalanceDTO;
import com.tbit.uqbike.object.pojo.dto.SubAccountMerchantsDTO;
import com.tbit.uqbike.object.pojo.vo.*;
import com.tbit.uqbike.webmanager.business.userdivide.object.SubAccountRatio;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 分账账户dao
 *
 * @Author:BUGTian
 * @DATE: 2022/5/24
 */
public interface SubAccountDao extends BaseMapper<SubAccount> {
    /**
     * 根据品牌id查询当前品牌分账账户
     *
     * @param accountId
     * @param state
     * @param nickName
     * @param phone
     * @return
     */
    List<SubAccount> selectByAccountIdAndState(@Param("accountId") Integer accountId, @Param("state") Integer state, @Param("nickName") String nickName, @Param("phone") String phone);

    /**
     * 新增分账账户
     *
     * @param subAccount
     * @return
     */
    int insert(SubAccount subAccount);

    /**
     * 更新memberId
     *
     * @param subAccountId
     * @param memberId
     */
    void updateMemberId(@Param("subAccountId") Integer subAccountId, @Param("memberId") String memberId);

    /**
     * 删除记录
     *
     * @param subAccountId
     */
    void deleteById(@Param("subAccountId") Integer subAccountId);

    /**
     * 更新状态
     *
     * @param subAccountId 主键
     * @param state        状态
     */
    void updateState(@Param("subAccountId") Integer subAccountId, @Param("state") Integer state);

    /**
     * 更新分账账户昵称
     *
     * @param subAccountId
     * @param nickName
     */
    void updateNickName(@Param("subAccountId") Integer subAccountId, @Param("nickName") String nickName,@Param("autoRemark")String autoRemark);

    /**
     * 根据状态查询分账账户
     *
     * @param state
     * @return
     */
    List<SubAccount> selectByState(@Param("state") Integer state);

    /**
     * 更新审核状态和账户状态
     *
     * @param subAccount
     */
    void updateAuditState(SubAccount subAccount);

    /**
     * 查询绑定关系是否存在
     *
     * @param subAccountBind
     * @return
     */
    SubAccountBind selectBand(SubAccountBind subAccountBind);

    /**
     * 添加绑定关系
     *
     * @param subAccountBind
     */
    void bandAccountUser(SubAccountBind subAccountBind);

    /**
     * 查询绑定用户列表
     *
     * @param subAccountId
     * @return
     */
    List<SubAccountBandUserVO> queryBandAccountUser(@Param("subAccountId") Integer subAccountId);

    /**
     * 删除绑定关系
     *
     * @param subAccountId
     * @param accountUserId
     */
    void deleteBand(@Param("subAccountId") Integer subAccountId, @Param("accountUserId") Integer accountUserId);

    /**
     * 根据主键查询
     *
     * @param subAccountId
     * @return
     */
    SubAccount selectById(@Param("subAccountId") Integer subAccountId);

    /**
     * 添加分账比例
     *
     * @param subAccountRatio
     */
    void insertSubAccountRatio(SubAccountRatio subAccountRatio);


    /**
     * 修改分账比例状态
     *
     * @param accountId 区域id
     * @param oleState  旧状态
     * @param newState  新状态
     * @param now       当前时间
     */
    void updateSubAccountRatioState(@Param("accountId") Integer accountId, @Param("oleState") Integer oleState, @Param("newState") Integer newState, @Param("now") Date now, @Param("type") Integer type, @Param("newUUID") String newUUID);

    /**
     * 根据状态查询分账比例
     *
     * @param state
     * @return
     */
    List<SubAccountRatio> selectRatioByState(@Param("state") Integer state, @Param("type") Integer type);


    /**
     * 根据商户id和状态查询
     *
     * @param memberId
     * @param state
     * @return
     */
    List<SubAccountRatio> selectRatioCountByMemberIdAndState(@Param("memberId") String memberId, @Param("state") Integer state);

    /**
     * 根据区域和状态查询
     *
     * @param accountId
     * @param state
     * @param groupId
     * @return
     */
    List<SubAccountRatioVO> querySubAccountRatio(@Param("accountId") Integer accountId, @Param("state") Integer state, @Param("groupId") String groupId, @Param("type") Integer type);

    /**
     * 取消未生效的分账比例
     *
     * @param accountId
     */
    void editSubAccountRatioState(@Param("accountId") Integer accountId, @Param("type") Integer type);

    /**
     * 查询用户已绑定的分账账户
     *
     * @param accountUserId
     * @return
     */
    SubAccountBind selectBandByAccountUserId(@Param("accountUserId") Integer accountUserId);

    /**
     * 查询绑定的分账账户
     *
     * @param accountUserId
     * @return
     */
    String selectBandMemberId(@Param("accountUserId") Integer accountUserId);


    /**
     * 查询汇付总金额和非汇付总金额
     *
     * @param accountId
     * @param phone
     * @return
     */
    SubAccountBalanceVO selectAdaPayBalanceTotal(@Param("accountId") Integer accountId, @Param("phone") String phone);

    /**
     * 查询用户余额信息
     *
     * @param accountId
     * @param phone
     * @return
     */
    List<SubAccountUserBalanceVO> queryUserBalance(@Param("accountId") Integer accountId, @Param("phone") String phone);

    /**
     * 更新用户余额
     *
     * @param subAccountId
     * @param balance
     */
    void updateBalance(@Param("subAccountId") Integer subAccountId, @Param("balance") Integer balance);

    /**
     * 查询用户提现列表
     *
     * @param accountId
     * @return
     */
    List<SubAccountWithdrawalVO> querySubAccountWithdrawal(@Param("accountId") Integer accountId);

    /**
     * 查询账户信息
     *
     * @param subAccountId
     * @return
     */
    SubAccountWithdrawalVO querySubAccountWithdrawalBySubAccountId(@Param("subAccountId") Integer subAccountId);

    /**
     * 查询所有账户信息
     *
     * @return
     */
    List<SubAccount> selectAll();

    /**
     * 查询分账比例中是否有该账户（未生效和生效中的）
     *
     * @param feeAccountNo
     * @return
     */
    Integer selectUserDivideCountByUserNo(@Param("feeAccountNo") String feeAccountNo);

    /**
     * 分组查询分账比例
     *
     * @param accountId
     * @param state
     * @return
     */
    List<SubAccountRatioGroupVO> querySubAccountGroupRatio(@Param("accountId") Integer accountId, @Param("state") Integer state, @Param("type") Integer type);

    /**
     * 根据品牌id和adaPay商户下的用户id查询分账账户信息
     *
     * @param memberId
     * @param accountId
     * @return
     */
    SubAccount selectByMemberIdAndAccountId(@Param("memberId") String memberId, @Param("accountId") Integer accountId);

    /**
     * 修改商户账户信息
     *
     * @param subAccountMerchantsDTO
     */
    void updateMerchants(SubAccountMerchantsDTO subAccountMerchantsDTO);

    TotalBalanceVO getTotalBalance(BalanceDTO balanceDTO);

    List<UserBalanceVO> getBalanceList(BalanceDTO balanceDTO);

    List<SubAccount> selectByAccountId(Integer accountId);
}
